#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/wait.h>

int main()
{
   while(1){
      printf("【user@host~~ 】$ ");
      fflush(stdout);

      char cmd[32]={0};
      fgets(cmd,1023,stdin);   //从标准输入获取一行数据

      cmd[strlen(cmd)-1]='\0';
      printf("cmd:[%s]\n",cmd);


      //字符串分割
      int argc=0;
      char* argv[32]={NULL};
      char* ptr=cmd;
      argv[argc++]=strtok(cmd," ");  //空格分隔
      while((argv[argc]=strtok(NULL," "))!=NULL){
         printf("[%s]\n",argv[argc]);
         argc++;
      } 
     
      int i=0;
      for(;argv[i]!=NULL;++i){
          printf("[%s]\n",argv[i]);
      }

      //当地一个字符为 cd 时候，则需要更改工作路径
      if(strcmp(argv[0],"cd")==0){
         chdir(argv[1]);
         continue;
       }
       
      int flag=0;
      char *redir_file=NULL;
      for(i=0;i<argc;++i){
         if(strcmp(argv[i],">")==0)   //清空重定向
          { 
            flag=1;
            argv[i]=NULL;
            redir_file=argv[i+1];
            break;
          }else if(strcmp(argv[i],">>")==0){
              flag=2;
              argv[i]=NULL;
              redir_file=argv[i+1];
              break;
          }
      }

     //创建子进程
     pid_t ret=fork();
     if(ret<0){
        perror("fork error!\n");
        continue;
     }
     else if(ret==0){
         //子进程实现程序替换
         if(flag==1)   //清空重定向
         { 
             int fp=open("temp.txt",O_CREAT|O_RDWR|O_TRUNC,0664);
             dup2(fp,1);
         }else if(flag==2){
             //追加重定向
             int fp=open("temp.txt",O_CREAT|O_RDWR|O_APPEND,0664);
             dup2(fp,1);
         }
         
        execvp(argv[0],argv);
        perror("execvp error!\n");
        exit(-1);
     }
      wait(NULL);
   }
   return 0;
}
